/* 
函数组合（Compose）是一种将多个函数组合成一个新函数的技术，执行顺序是从右到左（即最右边的函数首先执行，结果传递给下一个函数，依此类推）。下面我将实现一个通用的 compose 函数。
方法思路

参数验证：检查传入的参数是否都是函数。
处理边界情况：如果没有提供函数，返回一个恒等函数（即返回传入的参数本身）。
返回组合函数：从右到左依次执行所有函数，并将结果传递给下一个函数。
 */
function compose(...funcs) {
  // 检查所有参数是否都是函数
  for (const func of funcs) {
    if (typeof func !== 'function') {
      throw new TypeError('Expected all arguments to be functions');
    }
  }

  // 如果没有提供函数，返回恒等函数
  if (funcs.length === 0) {
    return arg => arg;
  }

  // 如果只有一个函数，直接返回该函数
  if (funcs.length === 1) {
    return funcs[0];
  }

  // 返回组合函数
  return funcs.reduce((pre, cur) => (...args) => pre(cur(...args)));
}

// 洋葱模型
// 基于洋葱模型的 compose 函数
function compose(middlewares) {
  const copyMiddlewares = [...middlewares]
  let index = 0
  const fn = () => {
    if (index > copyMiddlewares.length) {
      return
    }
    const middleware = copyMiddlewares[index]
    index++
    return middleware(fn)
  }
  return fn
}